#include <iostream>

using std::cout;
using std::endl;

//声明纯虚函数的特点就是为了作为接口进行使用的
//
//如果一个类声明了纯虚函数，那么该类就是抽象类；抽象类是不能
//创建对象的
class Base
{
public:
    //称为纯虚函数,纯虚函数的实现是留给派生类进行实现的
    virtual void show() = 0;
    virtual void print() = 0;
};

//抽象类的派生类如果也有纯虚函数没有实现，那么抽象类的派生类
//仍然也是抽象类，抽象类是不能创建对象的
class Derived
: public Base
{
public:
    virtual void show() override //C++11的关键字,表明是重写
    {
        cout << "void Derived::show()" << endl;
    }
};

class Derived2
: public Derived
{
public:
    virtual void print() override
    {
        cout << "void Derived2::print()" << endl;
    }
};

class A;

void test()
{
    /* Base base;//error */
    /* Derived derived;//error */
    /* derived.show(); */

    Derived2 derived2;
    derived2.show();
    derived2.print();

    cout <<endl << endl;
    //抽象类不能创建对象，但是可以创建该种类型的指针或者引用
    Base *pbase = &derived2;
    Base &ref = derived2;
    /* A a;//不能创建不完整类型的对象，但是可以创建不完整类型的指针 */
    /* A *pa;//ok */
    pbase->show();
    pbase->print();
}

int main(int argc, char *argv[])
{
    test();
    return 0;
}

